package Client;

import CommonOperationsClientServer.OperationsRefactor;
import GUIClient.GUIExtraFunctions;
import SwingWorkers.SwingWorkerDownloadFile;
import SwingWorkers.SwingWorkerUploadFile;
import java.io.BufferedReader;
import java.io.File;
import java.io.PrintWriter;
import javax.swing.JTextPane;

                //@Abraham Clase bastante poco orientada a objetos; emplear el patrón comando.
public class FilesOperationsClient {

    public static void downloadFile(BufferedReader input, PrintWriter output, String fileSource,
            String directoryDestination, JTextPane localPane, JTextPane serverPane) {
        File directory = new File(directoryDestination);
        if (directory.isDirectory()) {
            GUIExtraFunctions.updateTextPane(localPane,
                    "Solicitando Descarga del fichero: " + fileSource + " al directorio: "
                    + directoryDestination);
            OperationsRefactor.outputMessage(output, "downloadfile;" + fileSource);
            GUIExtraFunctions.updateTextPane(serverPane,
                    "Recibida Solicitud de Descarga de fichero: " + fileSource
                    + " al directorio: " + directoryDestination);
            try {
                String status = input.readLine();
                switch (status) {
                    case "notFileSelected":
                        GUIExtraFunctions.updatePanel(
                                localPane, serverPane,
                                "No se puede descargar un directorio. Solicitud Rechazada",
                                "ERROR!!! No se ha seleccionado un fichero como descarga. Solicitud Denegada");
                        break;
                    case "OK":
                        String fileName = input.readLine();
                        SwingWorkerDownloadFile downloadWorker = new SwingWorkerDownloadFile(
                                directoryDestination, fileName, input, localPane, serverPane);
                        downloadWorker.execute();
                        break;
                    case "notPrivilegedFile":
                        GUIExtraFunctions.updatePanel(
                                localPane, serverPane,
                                "No se tienen privilegios para descargar ese fichero. Solicitud Rechazada",
                                "ERROR!!! El cliente no tiene privilegios en ese fichero. Solicitud Denegada");
                        break;
                }
                //@Abraham Cuando se lanza una excepci+n no est de mas mostrar la traza;
                //Y te ests tragando excepciones Runtime
                //lo mismo para todos los m!todos de esta clase
            } catch (Exception e) {
                GUIExtraFunctions.updatePanel(localPane, serverPane, "Fallo en la comunicación...");
            }
        } else {
            GUIExtraFunctions.updateTextPane(localPane,
                    "No se puede descargar sobre un fichero... (" + directory.getPath()
                    + ") Selecciona un directorio");
        }
    }

    public static void uploadFile(BufferedReader input, PrintWriter output, String fileSource,
            String directoryDestination, JTextPane localPane, JTextPane serverPane) {
        File f;
        try {
            f = new File(fileSource);
            if (f.isFile()) {
                GUIExtraFunctions.updateTextPane(localPane,
                        "Solicitando Envío del fichero: " + f.getPath() + " al directorio: "
                        + directoryDestination);
                OperationsRefactor.outputMessage(output,
                        "uploadfile;" + f.getName() + ";" + directoryDestination);
                GUIExtraFunctions.updateTextPane(serverPane,
                        "Recibida Solicitud de Subida de fichero: " + f.getName()
                        + " al directorio: " + directoryDestination);
                String status = input.readLine();
                switch (status) {
                    case "notFolderSelected":
                        GUIExtraFunctions.updatePanel(localPane, serverPane, "Solicitud Rechazada",
                                "ERROR!!! No se ha seleccionado un directorio como destino");
                        break;
                    case "notPrivilegedDirectory":
                        GUIExtraFunctions.updatePanel(
                                localPane, serverPane, "Solicitud Rechazada",
                                "ERROR!!! El usuario no tiene privilegios para subir ficheros a este directorio");
                        break;
                    case "OK":
                        SwingWorkerUploadFile uploadWorker = new SwingWorkerUploadFile(f, output, localPane,
                                serverPane);
                        uploadWorker.execute();
                        break;
                }
            } else {
                GUIExtraFunctions.updateTextPane(localPane,
                        "No se puede enviar un directorio...(" + f.getName()
                        + ") Selecciona un fichero");
            }
        } catch (Exception e) {
            GUIExtraFunctions.updatePanel(localPane, serverPane, "Fallo en la comunicación...");
        }
    }

    public static void deleteFile(BufferedReader input, PrintWriter output, String fileName,
            JTextPane localPane, JTextPane serverPane) {
        GUIExtraFunctions.updateTextPane(localPane,
                "Enviando petición para eliminar fichero...(" + fileName + ")");
        OperationsRefactor.outputMessage(output, "deletefile;" + fileName);
        GUIExtraFunctions.updateTextPane(serverPane,
                "Recibida petición para eliminar fichero: " + fileName);
        try {
            //@Abraham ojo que readLine devuelve null si hay un fallo
            String response = input.readLine();
            switch (response) {
                case "filenotfound":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Fichero no encontrado... Petición Rechazada",
                            "Fichero no encontrado... Petición Denegada");
                    break;
                case "notfileselected":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "No se ha seleccionado un fichero... Petición Rechazada",
                            "No se ha seleccionado un fichero... Petición Denegada");
                    break;
                case "filedeleted":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Fichero (" + fileName + ") Borrado del Servidor",
                            "Fichero (" + fileName + ") Borrado");
                    break;
                case "notfiledeleted":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "El fichero (" + fileName + ") no se ha podido borrar del Servidor",
                            "El fichero (" + fileName + ") no se puede borrar");
                    break;
            }
        } catch (Exception e) {
            GUIExtraFunctions.updatePanel(localPane, serverPane, "Fallo en la comunicación...");
        }
    }

    public static void createFolder(BufferedReader input, PrintWriter output, String directoryFather,
            String folderName, JTextPane localPane, JTextPane serverPane) {
        OperationsRefactor.outputMessage(output, "createfolder;" + directoryFather + ";" + folderName);
        try {
            String response = input.readLine();
            switch (response) {
                case "notdirectoryselected":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "No se ha seleccionado un directorio en el árbol... Petición Rechazada",
                            "No se puede crear un directorio dentro de un fichero... Petición Denegada");
                    break;
                case "folderexists":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "El directorio existe... Petición Rechazada",
                            "El directorio existe... Petición Denegada");
                    break;
                case "foldernotcreated":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Fallo al crear la carpeta... Operación Abortada");
                    break;
                case "foldercreated":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Directorio (" + folderName + ") Creado en el Servidor",
                            "Directorio (" + folderName + ") Creado");
                    break;
            }
        } catch (Exception e) {
            GUIExtraFunctions.updatePanel(localPane, serverPane, "Fallo en la comunicación...");
        }
    }

    public static void deleteFolder(BufferedReader input, PrintWriter output, String folderName,
            JTextPane localPane, JTextPane serverPane) {
        GUIExtraFunctions.updateTextPane(localPane,
                "Enviando petición para eliminar directorio...(" + folderName + ")");
        OperationsRefactor.outputMessage(output, "deletefolder;" + folderName);
        GUIExtraFunctions.updateTextPane(serverPane,
                "Recibida petición para eliminar directorio: " + folderName);
        try {
            //@Abraham ojo que readLine devuelve null si hay un fallo
            String response = input.readLine();
            switch (response) {
                case "foldernotfound":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Directorio no encontrado... Petición Rechazada",
                            "Directorio no encontrado... Petición Denegada");
                    break;
                case "notfolderselected":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "No se ha seleccionado un directorio... Petición Rechazada",
                            "No se ha seleccionado un directorio... Petición Denegada");
                    break;
                case "foldernotdeleted":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "El directorio (" + folderName + ") no se ha podido borrar del Servidor",
                            "No se tienen permisos para borrar el directorio");
                    break;
                case "folderdeleted":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Directorio (" + folderName + ") Borrado del Servidor",
                            "Directorio (" + folderName + ") Borrado del Servidor");
                    break;
            }
        } catch (Exception e) {
            GUIExtraFunctions.updatePanel(localPane, serverPane, "Fallo en la comunicación...");
        }
    }

    public static void modifyServerLogDirectory(BufferedReader input, PrintWriter output, String newPath,
            JTextPane localPane, JTextPane serverPane) {
        OperationsRefactor.outputMessage(output, "modifyserverlog;" + newPath);
        try {
            String response = input.readLine();
            //@Abraham ojo que readLine devuelve null si hay un fallo
            switch (response) {
                case "equalsLogs":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "No se ha modificado el nombre del fichero de Log... Petición Rechazada",
                            "No se ha modificado el nombre del fichero de Log... Petición Denegada");
                    break;
                case "moveServerLogOK":
                    GUIExtraFunctions.updatePanel(localPane, serverPane, "Fichero de Log movido",
                            "Fichero de Log movido a: " + newPath);
                    break;
                case "invalidName":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Ya existe ese fichero. El Log no puede moverse");
                    break;
                case "moveServerLogFail":
                    GUIExtraFunctions.updatePanel(localPane, serverPane,
                            "Fallo al mover el fichero de Log... Operación Abortada");
                    break;
            }
        } catch (Exception e) {
            GUIExtraFunctions.updatePanel(localPane, serverPane, "Fallo en la comunicación...");
        }
    }
}
